package cn.com.zetatech.maple.entity;

import cn.com.zetatech.maple.annotation.WriterHandler;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;
import java.util.Map;

/**
 * @author cheng.cao@zetatech.com.cn
 */
@Getter
@Setter
@NoArgsConstructor
@WriterHandler(value = "cn.com.zetatech.maple.writer.hive.HiveWriterHandler", needPartition = true)
public class HiveWriter implements Writer {
    private String url;
    private String driver;
    private String username;
    private String password;
    /**
     * 输出到hive表
     */
    private String database;
    /**
     * 输出到hive表
     */
    private String table;
    /**
     * fs.defaultFS
     */
    private String defaultFS;
    /**
     * 字段隔符
     */
    private String fieldsTerminatedBy;

    /**
     * 上传到hdfs的目录（基础目录）
     */
    private String storeBasePath;

    /**
     * 分区字段，有序
     * 不分区时，该字段为null 或者 空数组
     */
    private List<Partition> partitions;

    /**
     * 由于我们写如hive过程采用如下步骤:
     * 1. 将数据生成并写入hdfs文件
     * 2. hive load数据
     * 其中的1步骤需要操作hdfs，而nameserver可能采用高可用方案
     * Java访问高可用的nameserver，所以需要一些配置信息
     * 当然可以直接拷贝相关的配置文件放置在classpath下，该方案可用！优点:无需改动代码，只需提供配置文件即可，缺点: 是针对全局的
     * <p>
     * 如果使用传入配置信息方案，优点：可以只针对某个日志,缺点:1.需要另外传递参数进来，2，多个日志需要配置多份
     * <p>
     * <p>
     * 我们项目中兼容上传2中方案
     * 如果确定不跨集群，可以直接拷贝配置文件到classpath即可
     * 如果有跨集群，则建议传递配置信息
     */
    private Map<String, String> conf;

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Partition {
        private String name;
        private String value;
        private String script;
        private String engineName = "groovy";
    }
}